/*
 * funcionesPFS.h
 *
 *  Created on: 25/09/2011
 *      Author: utn_so
 */

#ifndef FUNCIONESPFS_H_
#define FUNCIONESPFS_H_

#define pathCfg "/home/utn_so/Desarrollo/Workspace/PFS/Debug/CfgPFS.cfg"

typedef struct {
	int8_t BS_jmpBoot[3];
	int8_t BS_OEMName[8];
	int16_t BPB_BytsPerSec;
	int8_t BPB_SecPerClus;
	int16_t BPB_RsvdSecCnt;
	int8_t BPB_NumFATs;
	int16_t BPB_RootEntCnt;
	int16_t BPB_TotSec16;
	int8_t BPB_Media;
	int16_t BPB_FATSz16;
	int16_t BPB_SecPerTrk;
	int16_t BPB_NumHeads;
	int32_t BPB_HiddSec;
	int32_t BPB_TotSec32;
	int32_t BPB_FATSz32;   /* Cantidad De Sectores que ocupa una Fat */
	int16_t BPB_ExtFlags;
	int16_t BPB_FSVer;
	int32_t BPB_RootClus; /* Número del primer Cluster del Directorio Raiz*/
	int16_t BPB_FSInfo;
	int16_t BPB_BkBootSec;
	int8_t BPB_Reserved[12];
	int8_t BS_DrvNum;
	int8_t BS_Reserved1;
	int8_t BS_BootSig;
	int32_t BS_VolID;
	int8_t BS_VolLab[11];
	int8_t BS_FilSysType[8];
	int8_t BS_BootCode[420];
	int16_t BS_BootSign;
}__attribute__ ((__packed__)) stBootSector;

typedef struct {
int8_t FSI_Firma[4];
int8_t FSI_Reserved[480];
int8_t FSI_Firma2[4];
int32_t FSI_FreeClusters;
int32_t FSI_MostRecClust;
int8_t FSI_Reserved2[12];
int8_t FSI_Firma3[4];
}__attribute__ ((__packed__)) stFSInfo;

typedef struct {
int8_t  LFN_secuenceNumber;
uint16_t LFN_NombreParte1[5];
int8_t  LFN_Atributos;
int8_t  LFN_Reservados;
int8_t  LFN_CheckDOS;
uint16_t LFN_NombreParte2[6];
int16_t LFN_PrimerCluster;
uint16_t LFN_NombreParte3[2];
}__attribute__ ((__packed__)) stLongFileName;

typedef struct {
char nombre[13];
int32_t clusterInicial;
int32_t ultimoClusterOcupado;
}__attribute__ ((__packed__)) stEntradaDirectorio;

typedef struct {
int8_t DT_FileName[8]; /*El Byte Inicial es el que determina si esta disponible o no */
int8_t DT_Extension[3];
int8_t DT_FileAtrib; /* 0x0F es para determinar una entrada de nombre largo */
int8_t DT_Reserved;
int8_t DT_CreateTimeFR; /*En milisegundos de 0 a 199 */
int16_t DT_CreateTime; /* Little Endian 15-11 Horas, 10-5 Minutos, 4-0 Segundos --> Para los segundos hay q usar el anterior tambien */
int16_t DT_CreateDate; /* Idem Anterior: 15-9 Año ; 8-5 Mes ; 4-0 Dia */
int16_t DT_UltimaFechaAcc;
int16_t DT_ClusterInicialHigh; /*High 2 bytes of first cluster Number (?) */
int16_t DT_LastModTime;
int16_t DT_LastModDate;
int16_t DT_ClusterInicialLow; /* Low 2 bytes of first cluster */
int32_t DT_FileSize; /*Directorios o SubDirectorios deberian tener 0 */
}__attribute__ ((__packed__)) stDirectoryTable;

int16_t recorrerLargoArchivo (int16_t *archivoNombreLargo,int16_t tamMax);
uint32_t traducirArchivoNombreLargo(uint16_t *archNombreLargo,char **nombreCorto,int8_t largoArchivo);
int16_t unicode_utf16_to_utf8_inbuffer(const uint16_t *src_utf16, const size_t src_utf16size, char* dest_utf8, size_t *dest_utf8size);
int32_t* leerFatRegion ();
int32_t agregarClusterLibre(int32_t **clustersLibres, int32_t numeroDeCluster);
int32_t agregarNClustersLibres(int32_t *clustersLibres, int32_t *numerosDeClusters, int32_t n);
int32_t *removerNClusters(int32_t *clustersLibres, int32_t n, int32_t cantClusterTotal);
int32_t removerCluster(int32_t *clustersLibres);
int32_t obtenerClusterSiguiente (int32_t *vecDeClusters,int32_t clusterActual);
int32_t leerEntradas(int32_t nroCluster,char *archivoMapeado);
int32_t leerSubDirectorios (char *entradaABuscar);
void leerEntrada(int32_t nroCluster, char **sectores);
int32_t buscarEntrada(char *entradaABuscar,int32_t clusterEntrada);
void setearCfgPFS(char **pPuerto,char **pDirIp,char **pmiPuerto);
int16_t puertoANro (char *pPuerto);
#endif /* FUNCIONESPFS_H_ */
